package com.pllandxzx.config;

import com.pllandxzx.handler.MyHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

/**
 * WebSocket配置类  1.先注册 2.设置限制 3.初始化容器
 * 用于注册WebSocket处理器和配置WebSocket服务器容器
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    /**
     * 1.注册WebSocket处理器 负载于客户端连接
     * 将WebSocket处理器与URL路径绑定，并配置相关属性
     * @param registry WebSocket处理器注册器
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 注册WebSocket处理器，绑定到"/websocket/{userId}"路径
        // {userId}是路径变量，可在处理器中获取
        registry.addHandler(myHandler(), "/websocket/{userId}")
                .setAllowedOrigins("*");  // 允许所有来源的跨域请求
        // 生产环境应指定具体域名，例如："http://example.com"
    }

    /**
     * 2.配置WebSocket服务器容器和连接参数进行限制
     * 设置消息缓冲区大小等参数
     * @return ServletServerContainerFactoryBean实例
     */
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        // 设置文本消息缓冲区大小，单位为字节 限制单个 WebSocket 消息的最大大小
        container.setMaxTextMessageBufferSize(8192);  // 8KB
        // 设置二进制消息缓冲区大小，单位为字节 限制单个 WebSocket 消息的最大大小
        container.setMaxBinaryMessageBufferSize(8192);  // 8KB
        // 可选：设置WebSocket连接超时时间，单位为毫秒
        // container.setAsyncSendTimeout(5000);
        // 可选：设置最大会话超时时间，单位为毫秒
        // container.setMaxSessionIdleTimeout(300000);
        return container;
    }

    /**
     * 3.创建WebSocket处理器Bean
     * @return MyHandler实例
     */
    @Bean
    public MyHandler myHandler() {
        return new MyHandler();
    }

    /**
     * 这个Bean会自动注册所有使用@ServerEndpoint注解的WebSocket端点。
     * 这是连接JSR-356标准的WebSocket（如我们的ChatServerEndpoint）和Spring的关键。
     * @return ServerEndpointExporter 实例
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}